import mx.collections.ArrayCollection; 
import mx.rpc.events.*;
import mx.events.*;

[Bindable]
public var list:ArrayCollection = new ArrayCollection();
[Bindable]
public var tree:Array = new Array();

public var tree_idx:int = 0;
public var current:Object = new Object();
private var file_path:String = "";

// *********************************************************
// 変数宣言
// *********************************************************
public var srv:HTTPService;



private function initData():void {
	parentDocument.log("initData()が実行されました。");

	for(var i:int=0; i<parentDocument.dest.length; i++){

		//list.server[i] = parentDocument.dest[i]["server_name"];
		list.addItemAt(parentDocument.dest[i]["server_name"], i);


	}

}

// *********************************************************
// サーバを開く
// *********************************************************
public function ServerOpen():void {
	parentDocument.log("サーバを開く");

	var i:int = server.selectedIndex;


	parentDocument.log(parentDocument.dest[i]["server_name"]);
	parentDocument.log(parentDocument.dest[i]["send_url"]);
	parentDocument.log(parentDocument.dest[i]["method"]);
	parentDocument.log(parentDocument.dest[i]["data_format"]);

	// HTTPService発行
	HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "");

}

public function FileOpen():void {
	current = TreeView.selectedItem;
	var parent:Object = TreeView.getParentItem(current);
	var i:int = server.selectedIndex;


	LoadServerFile(current, parent, i);

}

// *********************************************************
// 保存ボタンクリック
// *********************************************************
public function Save():void {
	var i:int = server.selectedIndex;


	file_path = InputText.text;

	// ファイルの内容をサーバに問い合わせる
	HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "", InputText.text, true, true);
}

// *********************************************************
// サーバからファイルを開く
// *********************************************************
public function LoadServerFile(current:Object, parent:Object, i:int):void {
	parentDocument.log("LoadServerFile()開始");

	// 開くディレクトリパス用
	var dir:String = "";

	parentDocument.log("LoadServerFile:カウントォオオオオオ:" + current.numChildren);

	// ディレクトリパス名を作成
	dir = NodePathCheck(parent) + current.label;

	if (current.children == null) {
		// サーバのファイルを開く
		parentDocument.log("file");

		// ファイルのパスを格納
		file_path = dir;

		// ファイルの内容をサーバに問い合わせる
		HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "", dir, true);
	} else {
		// サーバのディレクトリを開く
		parentDocument.log("dir");

		// ディレクトリ構造をサーバに問い合わせる
		HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "", dir);
	}
}


// *********************************************************
// サーバにファイルを保存する
// *********************************************************
public function SaveServerFile(current:Object, parent:Object, i:int):void {
	parentDocument.log("SaveServerFile()開始");

	// 開くディレクトリパス用
//	var dir:String = "";

	// ディレクトリパス名を作成
//	dir = InputText.text;
	file_path = InputText.text;

	if (current.children == null) {
		// サーバのファイルを開く
		parentDocument.log("file");

		// サーバにファイルを保存する
		HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "", file_path, true, true);
	} else {
		// サーバのディレクトリを開く
		parentDocument.log("file_path");

		// ディレクトリ構造をサーバに問い合わせる
		HttpRequest(parentDocument.dest[i]["send_url"], parentDocument.dest[i]["method"], "", "", file_path);
	}
}


// *********************************************************
// HTTPServiceを使用する
// 
// 引数
// 第一：送信先URL
// 第二：メソッド（デフォルトは "GET" ）
// 第三：送信データのフォーマット（デフォルトは "data" ）
// 第四：送信データ（デフォルトは "" ）
// 第六：ファイルのディレクトリ
// 第五：ファイルフラグ（デフォルトは false）
// 第七：ファイルセーブフラグ(デフォルトは false)
// *********************************************************
public function HttpRequest( url:String, method:String = "GET", data_format:String = "data", str:String = "", dir:String="", file_flg:Boolean = false, save_flg:Boolean = false):void {
	parentDocument.log( "HTTP通信" );

	DropChange();

	var obj:Object = new Object;
	srv = new HTTPService();

	// HTTPService設定
	srv.method = method;
	srv.url = url;

	// 
	if(dir == ""){
		// 新しくサーバが開かれた
		srv.addEventListener("result", NewServerView);
	} else {
		if(file_flg) {
			if(save_flg) {
				// 保存処理実行
				parentDocument.log( "保存処理！" );
				srv.addEventListener("result", SaveFile);
				//obj["str"] = parentDocument.new_text.body.text;
				// TextArea:ObjecにTextOBを入れて保存したいテキストエリアを判断している
//				var TextArea:Object = parentDocument.TextOBJ["New" + parentDocument.TabMenu.selectedIndex.toString()];
				var TabVBox:Object = parentDocument.TabMenu.selectedChild;
				var TabTextArea:Object = TabVBox.getChildAt(0);

				obj["str"] = TabTextArea.body.text;

			} else {
				// 開いているサーバのファイル読み込み
				srv.addEventListener("result", LoadFile);
				srv.resultFormat = "text";
			}
		} else {
			// 開いているサーバのディレクトリ読み込み
			srv.addEventListener("result", AddServerView);
		}
	}

	// 送信データを指定
	obj["file_open_flg"] = file_flg;
	obj["file_save_flg"] = save_flg;
	obj["dir"] = dir;

	// 送信データをリクエストにセット
	srv.request = Object(obj);

	// HTTPService送信
	srv.send(obj);

}




// *********************************************************
// ツリーにノードを追加する
// 
// [ 引数 ]
// 第一：ノードに登録するデータ:ArrayCollection（必須）
// *********************************************************
public function CreateNode(NodeData:ArrayCollection):Array {


	var i:int = 0;
	var tree_array:Array = new Array();

	// グリッドにデータを追加する
	for each(var item:Object in NodeData) {
		// ユーザ名とメッセージが両方取得できた場合

		parentDocument.log(item.name + ":" + item.path + ":" + item.type);

		if((item.name != "..") && (item.name != ".")) {

			if(item.type == "dir") {
				tree_array[i] = new Array();
				tree_array[i]["label"] = item.name;

				// ディレクトリに設定
				tree_array[i]["children"] = new Array();
			} else {
				tree_array[i] = new Array();
				tree_array[i]["label"] = item.name;

				// ファイルに設定
				tree_array[i]["children"] = null;
			}

			i += 1;
		}


	}

	return tree_array;

}

// *****************************************************
// 選択されたノードまでのパスを取得
// *****************************************************
private function NodePathCheck(parent:Object):String {
	var dir:String = "";

	// ********************************************
	// 選択されたディレクトリまでのパス取得
	// ********************************************
	while(!(parent == null)){
		// 親のディレクトリをスラッシュ区切りで保存
		dir = parent.label + "/" + dir

		// 親の親ディレクトリを取得
		parent = TreeView.getParentItem(parent);
	}
	dir = "/" + dir;

	return dir;
}


// *********************************************************
// HTTPServiceの戻り値
// 新しくサーバを開いた場合
// *********************************************************
public function NewServerView(e:ResultEvent):void {
//		var result:Object = e.result;
	var result:Object = e.result;

	parentDocument.log("Starting NewServerView");

	// サーバのレスポンスを ArrayCollection に変換
	var resultData:ArrayCollection = new ArrayCollection();

	// XML構造から必要なデータ（今回は<data><row>）を取り出す
	resultData = result.data.row as ArrayCollection;

	// Treeを初期化する
	tree = new Array();

	// Treeを作成する
	tree = CreateNode(resultData);

	// Treeに反映する
	TreeView.dataProvider = tree;

	parentDocument.log("End NewServerView");
}


// *********************************************************
// HTTPServiceの戻り値
// ノードを追加した場合
// *********************************************************
public function AddServerView(e:ResultEvent):void {
//		var result:Object = e.result;
	var result:Object = e.result;

	parentDocument.log("Starting AddServerView");

	// サーバのレスポンスを ArrayCollection に変換
	var resultData:ArrayCollection = new ArrayCollection();

	// XML構造から必要なデータ（今回は<data><row>）を取り出す
	resultData = result.data.row as ArrayCollection;

	// Treeの子ノードを初期化
	current.children = new Array();

	// Treeを作成する
	current.children = CreateNode(resultData);

	TreeView.expandItem(current, true, true);

	parentDocument.log("End AddServerView");

}

// *********************************************************
// HTTPServiceの戻り値
// ファイルを読み込んだ
// *********************************************************
public function LoadFile(e:ResultEvent):void {
	var result:Object = e.result;
	var i:int = server.selectedIndex;

	var str:String = parentDocument.dest[i]["send_url"] + "?dir=" + file_path;
//	str += "&file_open_flg=true&file_save_flg=false&xdomain=true";

	parentDocument.log("Starting LoadFile");

	parentDocument.log("End LoadFile:text=" + result);

//	parentDocument.new_text.body.text = result;

	parentDocument.log("LoadFile:current.label=" + current.label);

//		parentDocument.new_text.body.text = result;

	var IDname:String = parentDocument.AddTextArea(current.label);

	parentDocument.TextAreaInput(parentDocument.TextOBJ[IDname], result, str);


	parentDocument.log("End LoadFile");

}

// *********************************************************
// HTTPServiceの戻り値
// ファイルを保存した
// *********************************************************
public function SaveFile(e:ResultEvent):void {
	var result:Object = e.result;
	var i:int = server.selectedIndex;


	parentDocument.log("Starting SaveFile");

	var str:String = parentDocument.dest[i]["send_url"] + "?dir=" + file_path;

	parentDocument.log("SaveFile:url=" + str);

	parentDocument.InputFilePath(str);

	parentDocument.log("SaveFile:text=" + result.data.message);

	parentDocument.log("End SaveFile");

}


// *********************************************************
// Treeがダブルクリックされた（読み込み）
// *********************************************************
public function TreeDoubleClick_Read(e:MouseEvent):void {

	var i:int = server.selectedIndex;
	tree_idx = TreeView.selectedIndex;
	current = TreeView.selectedItem;
	var parent:Object = TreeView.getParentItem(current);
	var dir:String = "";

	parentDocument.log("TreeDoubleClick_Read");


	parentDocument.log("ツリー：" + TreeView.selectedIndex);

	// サーバからファイルを読み込む
	LoadServerFile(current, parent, i);

}

// *********************************************************
// Treeがダブルクリックされた（保存）
// *********************************************************
public function TreeDoubleClick_Save(e:MouseEvent):void {

	var i:int = server.selectedIndex;
	tree_idx = TreeView.selectedIndex;
	current = TreeView.selectedItem;
	var parent:Object = TreeView.getParentItem(current);
	var dir:String = "";

	parentDocument.log("TreeDoubleClick_Save");


	parentDocument.log("ツリー：" + TreeView.selectedIndex);

	// サーバにファイルを保存する
	SaveServerFile(current, parent, i);


}


// *********************************************************
// Treeがクリックされた
// *********************************************************
public function TreeChange(e:ListEvent):void {

//	var i:int = server.selectedIndex;
	tree_idx = TreeView.selectedIndex;
	current = TreeView.selectedItem;
	var parent:Object = TreeView.getParentItem(current);

	parentDocument.log("Starting TreeChange");

	// ディレクトリパス名を作成
	InputText.text = NodePathCheck(parent) + current.label;

//	parentDocument.log("TreeClick：" + NodePathCheck(parent));

//	InputText.text = "a";

//	var parent:Object = TreeView.getParentItem(current);
//	var dir:String = "";

//	parentDocument.log("ツリー：" + TreeView.selectedIndex);

//	LoadServerFile(current, parent, i);

}

// *********************************************************
// 接続先コンボボックスが変更された
// *********************************************************
public function DropChange():void {
	parentDocument.log("change event starting...");

	var i:int = server.selectedIndex;

/*
	// 接続先のURLを取得
	var str:String = parentDocument.dest[i]["send_url"];

	str = str.substr(0, str.lastIndexOf("/")+1);

	str += "crossdomain.xml";

	parentDocument.log("change:" + str);

	// crossdomain.xmlの位置を指定
//	parentDocument.System.security.loadPolicyFile(str);
	parentDocument.setCrossdomainXML(str);
*/
	parentDocument.setCrossdomainXML(parentDocument.dest[i]["send_url"]+"?fxdomain=true");

	parentDocument.log("change event end");

}

